//定制请求的实例
//导入axios
import axios from 'axios';
import router from '@/router'
import {useTokenStore} from '@/stores/token.js'
import loginExpiredManager from '@/utils/loginExpiredManager.js'
// import { ElMessage } from 'element-plus'
//定义一个变量,记录公共的前缀  ,  baseURL

const instance = axios.create({  
    baseURL: '/api',  // 使用相对路径
    timeout: 10000,  // 增加默认超时时间到10秒
    // headers: {
    //     'Content-Type': 'application/x-www-form-urlencoded'  // 默认使用表单格式
    // }

});

//添加请求拦截器
instance.interceptors.request.use(
    (config)=>{
        //请求前的回调
        //添加token
        const tokenStore = useTokenStore();
        //判断有没有token
        if(tokenStore.token){
            config.headers.Authorization = tokenStore.token
        } else {
            // 尝试从localStorage获取token (兼容性处理)
            const localToken = localStorage.getItem('token')
            if (localToken) {
                config.headers.Authorization = localToken
                // 更新store中的token
                tokenStore.setToken(localToken)
            }
        }
        return config;
    },
    (err)=>{
        //请求错误的回调
        return Promise.reject(err)
    }
)

// 添加响应拦截器
instance.interceptors.response.use(
    response => {
        // 如果是二进制文件，直接返回
        if (response.config.responseType === 'blob') {
            // 检查响应内容是否为错误消息（有时服务器会返回错误信息作为blob）
            if (response.data.type && response.data.type.includes('application/json')) {
                // 可能是错误消息，尝试读取
                return new Promise((resolve, reject) => {
                    const reader = new FileReader();
                    reader.onload = () => {
                        try {
                            const errorData = JSON.parse(reader.result);
                            if (errorData.code !== 200) {
                                console.error(errorData.msg || '下载失败');
                                reject(errorData);
                            } else {
                                resolve(response.data);
                            }
                        } catch (e) {
                            // 如果不是JSON，就当作正常的二进制文件
                            resolve(response.data);
                        }
                    };
                    reader.readAsText(response.data);
                });
            }
            return response.data;
        }
        // 判断业务状态码
        if (response.data.code === 200) {
            return response.data;
        }
        // 操作失败
        console.error(response.data.msg ? response.data.msg : '服务异常');
        // 异步操作的状态转换为失败
        return Promise.reject(response.data);
    },
    (err) => {
        // 处理超时错误
        if (err.code === 'ECONNABORTED' && err.message.includes('timeout')) {
            console.error('请求超时，请稍后重试');
            return Promise.reject({ code: 408, msg: '请求超时' });
        }
        
        // 判断响应状态码, 如果为401, 则证明未登录, 显示登录失效提示
        if (err.response && err.response.status === 401) {
            // 检查当前页面是否为注册页面，如果是则不显示登录失效提示
            const currentPath = window.location.pathname;
            const isRegisterPage = currentPath === '/register';
            
            if (!isRegisterPage) {
                // 显示登录失效提示弹窗
                loginExpiredManager.show();
            } else {
                console.log('注册页面API调用失败，这是正常现象');
            }
        } else {
            // 针对下载失败的情况提供更明确的错误信息
            if (err.config && err.config.responseType === 'blob') {
                console.error('文件下载失败，请稍后重试');
            } else {
                console.error('服务异常');
            }
        }

        return Promise.reject(err); // 异步的状态转化成失败的状态
    }
);

export default instance;